package com.alks.function.mapper.chengKong;

import com.alks.entity.data.entity.*;
import com.alks.function.data.dto.chengKong.assort.YfBomMtlDto;
import com.alks.function.data.dto.chengKong.assort.YfCodeDto;
import com.alks.function.data.dto.chengKong.assort.YfMtlNewDto;
import com.alks.function.data.dto.chengKong.assort.YfSubMtlTemp2Dto;
import com.alks.function.data.request.chengKong.*;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.mapstruct.Mapper;

import java.math.BigDecimal;
import java.util.List;

@Mapper
public interface PartMapper {

    /**
     * 部位明细
     * @param request
     * @return
     */
    List<YfOrderPartName> getPartList(PartRequest request);

    /**
     * 查询序号
     * @param seqNo
     * @return
     */
    @Select("select SEQ_NO FROM YF_ORDER_PART_NAME WHERE SEQ_NO=#{seqNo}")
    String getPartSeqNo(String seqNo);

    /**
     * 查询部位名称
     * @param partName
     * @return
     */
    @Select("select PART_NAME FROM YF_ORDER_PART_NAME WHERE PART_NAME=#{partName}")
    String getPartName(String partName);

    /**
     * 部位建档
     * @param yfOrderPartName
     * @return
     */
    int addPart(YfOrderPartName yfOrderPartName);

    /**
     * 部位修改
     * @param yfOrderPartName
     * @return
     */
    int updatePart(YfOrderPartName yfOrderPartName);

    /**
     * 部位删除
     * @param partName
     * @return
     */
    @Delete("delete from YF_ORDER_PART_NAME where PART_NAME=#{partName}")
    int delPart(String partName);

    /**
     * 分类资料复合查询
     * @param request
     * @return
     */
    List<YfCodeDto> getClassificationList(MatterRequest request);

    /**
     * 根据名称规格单位查询
     * @param mtlUnit
     * @param mtlSpec
     * @param mtlName
     * @return
     */
    Integer getMaterialByName(@Param("mtlName") String mtlName,@Param("mtlSpec") String mtlSpec, @Param("mtlUnit") String mtlUnit);

    /**
     * 查询物料编码
     * @param typeNo3
     * @return
     */
    @Select("SELECT " +
            "    COALESCE(" +
            "        (SELECT CONCAT(#{typeNo3}, LPAD(CAST(SUBSTRING(MTL_NO, LENGTH(#{typeNo3}) + 1) AS UNSIGNED) + 1, 5, '0')) " +
            "         FROM YF_MTL_NEW " +
            "         WHERE MTL_NO LIKE CONCAT(#{typeNo3}, '%') " +
            "         ORDER BY CAST(SUBSTRING(MTL_NO, LENGTH(#{typeNo3}) + 1) AS UNSIGNED) DESC " +
            "         LIMIT 1)," +
            "        CONCAT(#{typeNo3}, LPAD('1', 5, '0'))" +
            "    ) AS new_MTL_NO;")
    String getMtlNo(@Param("typeNo3") String typeNo3);

    /**
     * 材料属性添加
     * @param yfMtlNew
     * @return
     */
    int AddMaterialProperties(YfMtlNew yfMtlNew);

    /**
     * 材料查询
     * @param request
     * @return
     */
    List<YfMtlNewDto> getMaterialQueryList(MaterialQueryRequest request);

    /**
     * 查询物料编码
     * @param mtlNo
     * @return
     */
    @Select("select MTL_NO,MTL_NAME,MTL_SPEC,MTL_UNIT,SYS_USER,UNEFFECT_DATE,ENG_NAME,VENDOR from YF_MTL_NEW where MTL_NO=#{mtlNo}")
    YfMtlNewDto getNumber(String mtlNo);

    /**
     * 材料查询删除
     * @param mtlNo
     * @return
     */
    @Delete("delete from YF_MTL_NEW where MTL_NO=#{mtlNo}")
    int delMaterialProperties(String mtlNo);

    /**
     * 材料查询修改
     * @param yfMtlNew
     * @return
     */
    int updateMaterialProperties(YfMtlNew yfMtlNew);

    /**
     *贴合材料正式材料查询
     * @param request
     */
    List<YfBomMtlDto> getAdhesiveMaterialList(AdhesiveMaterialRequest request);

    /**
     * 贴合材料开发材料查询
     * @param request
     * @return
     */
    List<YfBomMtlDto> getDevelopmentMaterialsList(AdhesiveMaterialRequest request);

    /**
     * 查询编码是否存在
     * @param mtlNo
     * @return
     */
    @Select("select MTL_NO from YF_SUB_MTL_TEMP2 where MTL_NO=#{mtlNo}")
    List<String> tempMtlNo(String mtlNo);

    /**
     * 根据用户名获取序号
     * @param userName
     * @return
     */
    @Select("select MTL_SEQ from YF_SUB_MTL_TEMP2 where SYS_USER=#{userName}")
    List<BigDecimal> getSerialNumber(String userName);

    /**
     * 贴合材料建档添加
     * @param yfSubMtlTemp2
     * @return
     */
    int addCache(YfSubMtlTemp2 yfSubMtlTemp2);

    /**
     * 获取编码
     * @return
     */
    String getMaterialMtlNo();

    /**
     * 插入贴合材料
     * @param yfBomMtl
     * @return
     */
    int addCompositeMaterials(YfBomMtl yfBomMtl);

    /**
     * 删除贴合材料建档
     * @param ids
     * @param userName
     */
    int delCache(@Param("ids") List<String> ids,
                 @Param("userName") String userName);

    /**
     * 查询编码是否存在
     * @param subMtlNo
     * @return
     */
    @Select("select MTL_NO,MTL_COLOR,MTL_NAME,MTL_SPEC,MTL_UNIT,VENDOR from YF_BOM_MTL where MTL_NO=#{subMtlNo} ")
    YfBomMtlDto getMaterialStyleNo(@Param("subMtlNo") String subMtlNo);

    /**
     * 根据物料颜色和名称查询是否重复
     * @param mtlColor
     * @param mtlName
     * @param mtlSpec
     * @param mtlUnit
     * @return
     */
    @Select({
            "<script>",
            "SELECT MTL_NO, MTL_COLOR, MTL_NAME, MTL_SPEC, MTL_UNIT, VENDOR",
            "FROM YF_BOM_MTL",
            "WHERE MTL_COLOR = #{mtlColor} AND MTL_NAME = #{mtlName} and MTL_UNIT=#{mtlUnit}",
            "<if test='mtlSpec != null and mtlSpec != \"\"'>",
            "AND MTL_SPEC = #{mtlSpec}",
            "</if>",
            "</script>"
    })
    YfBomMtlDto getYfBomMtl(@Param("mtlColor") String mtlColor, @Param("mtlName") String mtlName, @Param("mtlSpec") String mtlSpec, @Param("mtlUnit") String mtlUnit);

    /**
     * 判断是否被引用
     * @param mtlName
     * @param mtlSpec
     * @param mtlUnit
     * @return
     */
    @Select({
            "<script>",
            "SELECT MTL_NO, MTL_COLOR, MTL_NAME, MTL_SPEC, MTL_UNIT, VENDOR",
            "FROM YF_BOM_MTL",
            "WHERE MTL_NAME = #{mtlName} and MTL_UNIT=#{mtlUnit}",
            "<if test='mtlSpec != null and mtlSpec != \"\"'>",
            "AND MTL_SPEC = #{mtlSpec}",
            "</if>",
            "limit 1",
            "</script>"
    })
    YfBomMtlDto getYfBomMtl2(@Param("mtlName") String mtlName, @Param("mtlSpec") String mtlSpec, @Param("mtlUnit") String mtlUnit);

    /**
     * 贴合材料建档列表
     * @param userName
     */
    List<YfSubMtlTemp2Dto> getCacheList(@Param("userName") String userName);

    /**
     * 根据id获取
     * @param id
     * @return
     */
    @Select("select * from YF_SUB_MTL_TEMP2 where ID=#{id}")
    YfSubMtlTemp2Dto getCacheById(@Param("id") Integer id);

    /**
     * 修改
     * @param id
     * @param mtlSeq
     * @return
     */
    int updateCacheById(@Param("id")Integer id,
                        @Param("mtlSeq")BigDecimal mtlSeq);

    /**
     * 修改
     * @param request
     * @return
     */
    int updateCache(CacheRequest request);

    /**
     * 贴合材料与子材料的记录表中
     * @param yfBomFitSubList
     */
    @Insert({
            "<script>",
            "insert into YF_BOM_FIT_SUB(COMPANY_ID,MTL_NO,MTL_NAME,MTL_SPEC,MTL_UNIT,MTL_COLOR,SUB_MTL_NO,SUB_MTL_NAME,SUB_MTL_SPEC," +
                    "SUB_MTL_UNIT,SUB_MTL_COLOR,SYS_USER,PRD_TYPE,PERCENT,PUR_FLAG,MTL_SEQ,VENDOR) " +
            "values"+
            "<foreach collection='yfBomFitSubList' item='item' separator=','>",
            "( #{item.companyId},#{item.mtlNo},#{item.mtlName},#{item.mtlSpec},#{item.mtlUnit},#{item.mtlColor},#{item.subMtlNo}," +
                    "#{item.subMtlName},#{item.subMtlSpec},#{item.subMtlUnit},#{item.subMtlColor},#{item.sysUser},#{item.prdType}," +
                    "#{item.percent},#{item.purFlag},#{item.mtlSeq},#{item.vendor})",
            "</foreach>",
            "</script>",
    })
    void addCacheToYfBomFitSub(@Param("yfBomFitSubList") List<YfBomFitSub> yfBomFitSubList);

    /**
     * 查询贴合子材料是否存在
     * @param mtlNo
     */
    @Select("select MTL_NO from YF_BOM_FIT_SUB where MTL_NO=#{mtlNo} LIMIT 1")
    String getCacheToYfBomFitSub(String mtlNo);

    /**
     * 查询颜色型体资料段
     * @param styleNo
     * @param styleColor
     * @param partName
     * @return
     */
    @Select("select SEGMENT from YF_BOM_PART_NEW2 where STYLE_NO=#{styleNo} and STYLE_COLOR=#{styleColor}" +
            "and PART_NAME=#{partName}")
    List<String> getPositionSegment(@Param("styleNo")String styleNo,
                            @Param("styleColor")String styleColor,
                            @Param("partName") String partName);

    /**
     * 删除当前用户的贴合数据
     * @param userName
     * @return
     */
    int delYfSubMtlTemp2(String userName);

    /**
     * 根据物料名称返回信息
     *
     * @param mtlName
     * @param mtlSpec
     * @param mtlUnit
     * @return
     */
    YfBomMtlDto getMtlNameByMaterial(@Param("mtlName") String mtlName, @Param("mtlSpec") String mtlSpec, @Param("mtlUnit") String mtlUnit);

    /**
     * 获取颜色
     * @param request
     * @return
     */
    String getBomMtlColor(AdhesiveMaterialChooseRequest request);

    /**
     * 根据物料名称删除
     * @param mtlNo
     * @return
     */
    int delMtlNoByMaterial(String mtlNo);

    /**
     * 根据物料名称删除贴合子材料
     * @param mtlNo
     * @return
     */
    int delMtlNoByMaterial2(String mtlNo);

    /**
     * 修改物料名称
     * @param mtlNo
     * @param mtlName
     * @return
     */
    int updateYfBomMtl(@Param("mtlNo") String mtlNo, @Param("mtlName") String mtlName);

    /**
     * 查询物料编码是否被引用
     * @param mtlNo
     * @return
     */
    Integer getYfBomMtlByMtlNo(String mtlNo);

    /**
     * 0 未审核 1审核 2 退回
     * @param request
     */
    void updateCheck(@Param("list") List<MaterialQueryRequest> request,String status);

    String getBomMtlColor2(AdhesiveMaterialChooseRequest request);
}
